
const jwt=require('jsonwebtoken')
const {NAME_OR_PASSWORD,NAME_IS_NOT_EXISTE,PASSWORD_INCREMENT,NOT_AUTHORIZED,DIFFERENT_USER}=require("../constants/error_type")
const service=require("../service/UserService")
const md5password=require("../utils/password_handle")
const {PRIVATE_KEY,PUBLIC_KEY}=require("../app/config")
const autorouter = require('../router/auto.router')
const {compareMoment}=require("../service/AuthService")
    //验证登录 密码用户名存在
   const auto=async (ctx,next)=>{
      //获取传递值
      const {name,password}=ctx.request.body
      //判断
      if(!name||!password||name==""||password==""){
       
          const error=new Error(NAME_OR_PASSWORD)
          //发送错事件
          return ctx.app.emit("error",error,ctx)
      }
      //判断用户是否存在
     const result=await service.getName(name) 
    
     const user=result[0]
     console.log(user)
    
     if(!user){
         const error=new Error(NAME_IS_NOT_EXISTE)
         return ctx.app.emit("error",error,ctx)
     }
     //判断密码是否正确 要加密后的密码比较
    
      if(md5password(password)!==user.password){
         const error=new Error(PASSWORD_INCREMENT)
         return ctx.app.emit("error",error,ctx)
     }
      //全部验证成功 添加一个携带数据的属性
     ctx.user=user;  
     //过滤玩就执行next
     await next();
}
// 验证token
const verifyAuth=async (ctx,next)=>{
    console.log("验证middlware")   
    const authorization=ctx.headers.authorization
    console.log(authorization)
    //对authorization进行验证
    if(!authorization){
        const error=new Error(NOT_AUTHORIZED);
        return ctx.app.emit("error",error,ctx)
    }
    const token=authorization.replace('Bearer ', '');
 
    try {
        const result=await jwt.verify(token,PUBLIC_KEY,{
            algorithms:["RS256"]
        })  
        //将结果放入到user中 需要保存
       ctx.user=result;
   
        await  next()
    } catch (err) {
        const error=new Error(NOT_AUTHORIZED)
        return ctx.app.emit("error",error,ctx)
    }
}
/**
 * 
 * @param {*} ctx 
 * @param {*} next 
 * @returns 
 * 很多内容都需要验证权限 修改/删除动态 修改/删除评论
 * 接口 业务接口/后台管理系统
 * 一对一 user->role
 * 多对多 role->menu(删除动态/修改动态)
 */
   //获取权限
   const getPower=async (ctx,next)=>{
    console.log("获取getPower权限")
    //拿到对应的key Object.keys 返回对象属性的数组
    const  [resourceKey]=Object.keys(ctx.params)
    const tableName=resourceKey.replace("id","")
    const resourceid=ctx.params[resourceKey]   
    console.log(resourceid)
    //获取修改用户的id
    const {id,name}=ctx.user;
    //获取登录的id
    const {momentid}=ctx.params;
    const result= await compareMoment(tableName,resourceid,id)
    console.log(result)
    //进行判断 如果没有结果发出错误
     if(!result){
        await next() 
     }else{
         const error=new Error(DIFFERENT_USER)
         return ctx.app.emit("error",error,ctx)
     } 
}
module.exports={auto,verifyAuth,getPower}